import NativeFrameUtil from "@/NativeFrameUtil";
import { 单位界面配置 } from "./配置";
import { Frame } from "@/frame";
import SelectUtil from "@/SelectUtil";
import { Unit } from "@/unit";
import 单位函数 from "框架/通用/单位";
import { Trigger } from "@/trigger";
import 护盾系统 from "框架/系统/护盾系统";

export default class 单位界面 {
  static 单位信息配置 = 单位界面配置;
  static 根面板: Frame;
  static 文本面板数组: { [index: string]: Frame } = {};
  static 属性面板数据数组: { [index: string]: 单位状态信息 } = {};
  constructor() {
    单位界面.隐藏原生UI();
    单位界面.处理单位信息配置();
    this.创建单位信息UI();

    let t = new Trigger();
    t.registerTimerEvent(0.1, true);
    t.addAction(this.刷新单位信息UI);
  }
  刷新单位信息UI(this: void) {
    let 选中 = SelectUtil.getRealSelectUnit();
    if (选中 == null) {
      单位界面.根面板.visible = false;
      return;
    }
    if (单位界面.根面板.visible == false) {
      单位界面.根面板.visible = true;
    }
    单位界面.更新单位信息(选中);
  }
  static 更新单位信息(目标: unit) {
    let 文本 = 单位界面.文本面板数组;
    let 单位 = Unit.fromHandle(目标);
    文本.体质.setText(I2S(R2I(单位函数.取总耐力(目标))));
    文本.力量.setText(I2S(R2I(单位函数.取总力量(目标))));
    文本.敏捷.setText(I2S(R2I(单位函数.取总敏捷(目标))));
    文本.智力.setText(I2S(R2I(单位函数.取总智力(目标))));
    文本.精神.setText(I2S(R2I(单位函数.取总精神(目标))));
    文本.移动.setText(I2S(R2I(单位.moveSpeed ?? 0)));
    文本.攻击.setText(单位函数.取固定攻击(目标).toString());
    文本.物理暴击.setText(`${单位函数.取物理暴击率(目标) * 100}%`);
    文本.物理暴击伤害.setText(`${单位函数.取物理暴击伤害(目标) * 100}%`);
    文本.护甲.setText(单位函数.取总护甲(目标).toString());
    文本.法强.setText(单位函数.取法强(目标).toString());
    文本.法术暴击.setText(`${单位函数.取法术暴击率(目标) * 100}%`);
    文本.法术暴击伤害.setText(`${单位函数.取法术暴击伤害(目标) * 100}%`);
    文本.魔抗.setText(单位函数.取总魔抗(目标).toString());
    文本.冷却.setText(`${1 - 单位函数.取冷却降低(目标)}%`);
    文本.治疗.setText(`${单位函数.取治疗增强(目标) * 100}%`);
    文本.闪避.setText(`${单位函数.取总闪避(目标) * 100}%`);
    文本.射程.setText(I2S(GetUnitState(目标, UnitStateDamageRange)));
    文本.生命.setText(
      `${Math.ceil(GetUnitState(目标, UNIT_STATE_LIFE))}/${R2I(
        GetUnitState(目标, UNIT_STATE_MAX_LIFE)
      )}`
    );
    文本.生命条.setSize(0.12 * GetUnitLifePercent(目标) * 0.01, 0.012);
    文本.魔法.setText(
      `${R2I(GetUnitState(目标, UNIT_STATE_MANA))}/${R2I(
        GetUnitState(目标, UNIT_STATE_MAX_MANA)
      )}`
    );
    文本.生命回复.setText(单位函数.取生命回复(目标).toString());
    文本.魔法回复.setText(单位函数.取法力回复(目标).toString());
    文本.护盾.setText(`护盾:${R2I(护盾系统.获取总护盾值(目标))}`);
  }
  创建单位信息UI() {
    let 根UI = DzGetGameUI();
    // 自己的根面板
    let 根面板 = Frame.createFrame(根UI)
      .setSize(0.2, 0.08)
      .setPoint(FRAMEPOINT_BOTTOM, 根UI, FRAMEPOINT_BOTTOM, 0.003, 0);
    单位界面.根面板 = 根面板;
    let { 五维, 状态 } = 单位界面.单位信息配置;

    // 五维界面
    for (let item of 五维) {
      let 面板 = Frame.createFrame(根面板.current)
        .setSize(item.宽度, item.高度)
        .setPoint(
          FRAMEPOINT_TOPLEFT,
          根面板.current,
          FRAMEPOINT_TOPLEFT,
          item.x,
          item.y
        );
      // 图标
      Frame.createBackDrop(面板.current)
        .setPoint(FRAMEPOINT_TOPRIGHT, 面板.current, FRAMEPOINT_TOPRIGHT, 0.01)
        .setSize(0.015, 0.015)
        .setTexture(item.图标);
      // 文本
      let 文本面板 = Frame.createTEXT(面板.current)
        .setSize(0.035, 0.015)
        .setPoint(FRAMEPOINT_TOPLEFT, 面板.current, FRAMEPOINT_TOPLEFT)
        .setText("0")
        .setFont(0.012, "assets\\fonts\\fonts.ttf");
      文本面板.setOnMouseEnter(单位界面.显示提示);
      文本面板.setOnMouseLeave(单位界面.隐藏提示);
      文本面板.setTextAlignment(TEXTALIGN_RIGHT);
      单位界面.文本面板数组[item.key] = 文本面板;
      单位界面.属性面板数据数组["f" + 文本面板.current] = item;
    }
    // 状态界面
    for (let item of 状态) {
      let 面板 = Frame.createFrame(根面板.current)
        .setSize(item.宽度, item.高度)
        .setPoint(
          FRAMEPOINT_TOPLEFT,
          根面板.current,
          FRAMEPOINT_TOPLEFT,
          item.x,
          item.y
        );
      // 图标
      Frame.createBackDrop(面板.current)
        .setPoint(FRAMEPOINT_TOPRIGHT, 面板.current, FRAMEPOINT_TOPRIGHT, 0.01)
        .setSize(0.02, 0.02)
        .setTexture(item.图标);
      // 文本
      let 文本面板 = Frame.createTEXT(面板.current)
        .setSize(0.048, 0.02)
        .setPoint(FRAMEPOINT_TOPLEFT, 面板.current, FRAMEPOINT_TOPLEFT)
        .setText("0")
        .setFont(0.012, "fonts\\fonts.ttf");
      文本面板.setOnMouseEnter(单位界面.显示提示);
      文本面板.setOnMouseLeave(单位界面.隐藏提示);
      文本面板.setTextAlignment(TEXTALIGN_RIGHT);
      单位界面.文本面板数组[item.key] = 文本面板;
      单位界面.属性面板数据数组["f" + 文本面板.current] = item;
    }

    // 数值根面板
    let 单位头像根面板 = Frame.createFrame(根UI)
      .setSize(0.1, 0.04)
      .setPoint(FRAMEPOINT_BOTTOMLEFT, 根UI, FRAMEPOINT_BOTTOMLEFT, 0.185, 0);
    // shieldBar
    let 护盾背景 = Frame.createBackDrop(单位头像根面板.current)
      .setTexture("assets\\status\\statu-bar-bg.blp")
      .setSize(0.12, 0.012)
      .setPoint(
        FRAMEPOINT_TOPLEFT,
        单位头像根面板.current,
        FRAMEPOINT_TOPLEFT,
        0,
        0
      );
    let 护盾文本 = Frame.createTEXT(护盾背景.current)
      .setSize(0.12, 0.012)
      .setPoint(FRAMEPOINT_TOPLEFT, 单位头像根面板.current, FRAMEPOINT_TOPLEFT)
      .setText("护盾:0")
      .setTextColor(0xffeeee00)
      .setFont(0.01, "assets\\fonts\\fonts.ttf");
    护盾文本.setTextAlignment(TEXTALIGN_CENTER);
    单位界面.文本面板数组["护盾"] = 护盾文本;
    // lifeBar
    let 生命条背景 = Frame.createBackDrop(单位头像根面板.current)
      .setTexture("assets\\bg_64x64.blp")
      .setSize(0.12, 0.012)
      .setPoint(
        FRAMEPOINT_TOPLEFT,
        单位头像根面板.current,
        FRAMEPOINT_TOPLEFT,
        0,
        -0.013
      );
    let 生命条 = Frame.createBackDrop(生命条背景.current)
      .setTexture("assets\\status\\hp-bar.blp")
      .setSize(0.12, 0.012)
      .setPoint(
        FRAMEPOINT_TOPLEFT,
        生命条背景.current,
        FRAMEPOINT_TOPLEFT,
        0,
        0
      );
    单位界面.文本面板数组["生命条"] = 生命条;
    let 生命文本 = Frame.createTEXT(生命条背景.current)
      .setSize(0.12, 0.012)
      .setPoint(FRAMEPOINT_TOPLEFT, 生命条背景.current, FRAMEPOINT_TOPLEFT)
      .setText("0/0")
      .setTextColor(0xff00ee00)
      .setFont(0.01, "assets\\fonts\\fonts.ttf");
    生命文本.setTextAlignment(TEXTALIGN_CENTER);
    单位界面.文本面板数组["生命"] = 生命文本;
    let 生命回复文本 = Frame.createTEXT(生命条背景.current)
      .setSize(0.12, 0.012)
      .setPoint(
        FRAMEPOINT_TOPLEFT,
        生命条背景.current,
        FRAMEPOINT_TOPLEFT,
        0,
        0.0
      )
      .setText("0")
      .setTextColor(0xff00ee00)
      .setFont(0.01, "assets\\fonts\\fonts.ttf");
    生命回复文本.setTextAlignment(TEXTALIGN_RIGHT);
    单位界面.文本面板数组["生命回复"] = 生命回复文本;

    // manaBar
    let 魔法背景 = Frame.createBackDrop(单位头像根面板.current)
      .setTexture("assets\\bg_64x64.blp")
      .setSize(0.12, 0.012)
      .setPoint(
        FRAMEPOINT_TOPLEFT,
        单位头像根面板.current,
        FRAMEPOINT_TOPLEFT,
        0,
        -0.026
      );
    let 魔法文本 = Frame.createTEXT(魔法背景.current)
      .setSize(0.12, 0.012)
      .setPoint(FRAMEPOINT_TOPLEFT, 魔法背景.current, FRAMEPOINT_TOPLEFT)
      .setText("0/0")
      .setTextColor(0xff0000ee)
      .setFont(0.01, "assets\\fonts\\fonts.ttf");
    魔法文本.setTextAlignment(TEXTALIGN_CENTER);
    单位界面.文本面板数组["魔法"] = 魔法文本;
    let 魔法回复文本 = Frame.createTEXT(魔法背景.current)
      .setSize(0.12, 0.012)
      .setPoint(FRAMEPOINT_TOPLEFT, 魔法背景.current, FRAMEPOINT_TOPLEFT)
      .setText("0")
      .setTextColor(0xff0000ee)
      .setFont(0.01, "assets\\fonts\\fonts.ttf");
    魔法回复文本.setTextAlignment(TEXTALIGN_RIGHT);
    单位界面.文本面板数组["魔法回复"] = 魔法回复文本;

    // attr tip
    let 提示背景 = new Frame("BACKDROP", null, null, "_sl_border_backdrop", 0);
    单位界面.文本面板数组["提示"] = Frame.createTEXT(根UI)
      .setAbsPoint(FRAMEPOINT_BOTTOMRIGHT, 0.78, 0.17)
      .setSize(0.16, 0)
      .setTextColor(0xff00ff00)
      .setFont(0.012, "assets\\fonts\\fonts.ttf");
    提示背景
      .setParent(单位界面.文本面板数组["提示"].current)
      .setPoints(单位界面.文本面板数组["提示"].current, 0.01, 0.01);
    单位界面.文本面板数组["提示"].visible = false;
  }
  static 处理单位信息配置() {
    let i = 0;
    for (let item of 单位界面.单位信息配置.状态) {
      item.宽度 = 0.06;
      item.高度 = 0.02;
      item.x = 0.01 + Math.floor(i / 4) * 0.06;
      item.y = 0.01 + Math.floor(i % 4) * -0.02;
      i++;
    }
    i = 0;
    for (let item of 单位界面.单位信息配置.五维) {
      item.宽度 = 0.045;
      item.高度 = 0.015;
      item.x = -0.05;
      item.y = 0.05 + i * -0.015;
      i++;
    }
  }
  static 隐藏原生UI() {
    let u = DzSimpleFrameFindByName("SimpleInfoPanelUnitDetail", 0);

    DzFrameClearAllPoints(u);
    DzFrameSetSize(u, 0.5, 0.4);
    DzFrameSetPoint(u, 4, DzGetGameUI(), 4, 0, -0.5);
    // 姓名
    let np = NativeFrameUtil.getUnitName();
    DzFrameClearAllPoints(np);
    DzFrameSetSize(np, 0.177, 0.014);
    DzFrameSetTextAlignment(np, TEXTALIGN_CENTER);
    DzFrameSetAbsolutePoint(np, FRAMEPOINT_TOPLEFT, 0.315, 0.12);
  }
  static 显示提示(this: void) {
    let 面板 = DzGetTriggerUIEventFrame();
    let 数据 = 单位界面.属性面板数据数组["f" + 面板];
    单位界面.文本面板数组["提示"].setText(数据.提示信息);
    单位界面.文本面板数组["提示"].visible = true;
  }
  static 隐藏提示(this: void) {
    单位界面.文本面板数组["提示"].visible = false;
  }
}
